#include <iostream>
#include <unistd.h>
#include <signal.h>

using namespace std;


void PrintPending(const sigset_t& pending)
{
    for(int i=31;i>0;i--)
    {
        if(sigismember(&pending, i))
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }
    cout << endl << endl;
}

void handler(int signo)
{
    cout << "catch a signo: " << signo << endl;
}

int main()
{
    // sigset_t bset, oset;
    // sigemptyset(&bset);
    // sigemptyset(&oset);
    // for (int i = 1; i <= 31; i++)
    // {
    //     sigaddset(&bset, i);
    // }
    // sigprocmask(SIG_SETMASK, &bset, &oset);

    // sigset_t pending;
    // while (true)
    // {
    //     // 2.1 获取
    //     int n = sigpending(&pending);
    //     if (n < 0)
    //         continue;
    //     // 2.2 打印
    //     PrintPending(pending);
    //     sleep(1);
    // }

    // 1 对2号信号进行屏蔽
    sigset_t bset, oset;
    sigemptyset(&bset);
    sigemptyset(&oset);
    sigaddset(&bset, 2);

    // 1.2 调用系统调用，把数据设置进内核
    sigprocmask(SIG_SETMASK, &bset, &oset);
    signal(2, handler);

    // 2 重复打印当前进程pending
    sigset_t pending;
    int count = 0;
    while(true)
    {
        // 2.1 获取
        int n = sigpending(&pending); 
        if(n < 0)
            continue;
        // 2.2 打印
        PrintPending(pending);

        sleep(1);
        count++;
        // 2.3 解除阻塞
        if(count == 20)
        {
            cout << "unblock 2 signo" << endl;
            //sigprocmask(SIG_SETMASK, &oset, nullptr);
            sigdelset(&bset, 2);
            sigprocmask(SIG_SETMASK, &bset, nullptr);
        }
    }
    // 3 发送信号2号信号

    return 0;
}